package com.flydog.taskManager.service;

import com.flydog.taskManager.common.api.PageResponse;
import com.flydog.taskManager.dto.PhaseTaskSearchParam;
import com.flydog.taskManager.dto.PhasedTaskParam;
import com.flydog.taskManager.dto.PhasedTaskTreeStructure;
import com.flydog.taskManager.dto.PhasedTaskWithChildren;
import com.flydog.taskManager.entity.PhasedTask;

import java.util.*;

/**
 * @author Cao
 * @description 阶段性工作服务
 * @create 2021-05-10
 */

public interface PhasedTaskService {
    /**
     * 创建阶段性工作
     *
     * @param param 阶段性工作参数
     * @return 创建的数量
     */
    PhasedTask createTask(PhasedTaskParam param);

    /**
     * 修改阶段性工作信息
     * @param id 工作ID
     * @param param 工作信息
     * @return 修改后的信息
     */
    PhasedTask update(Long id, PhasedTaskParam param);

    /**
     * 删除阶段性任务
     *
     * @param ids 任务ID
     * @return 删除的工作数量
     */
    Set<Long> deleteTask(Long[] ids);

    /**
     * 获取阶段性工作信息
     *
     * @param id 工作ID
     * @return 工作信息
     */
    Optional<PhasedTask> getTask(Long id);

    /**
     * 分页获取时间段内结束的工作信息
     *
     * @param begin    时间段开始时间
     * @param end      时间段结束时间
     * @param pageNum  分页页数
     * @param pageSize 分页大小
     * @return 工作信息
     */
    PageResponse<PhasedTask> listByEndDate(Calendar begin, Calendar end, int pageNum, int pageSize);

    /**
     * 获取时间段内结束的所有工作信息
     * @param begin    时间段开始时间
     * @param end      时间段结束时间
     * @return 工作信息
     */
    List<PhasedTask> listByEndDate(Calendar begin, Calendar end);

    /**
     * 分页获取时间段内开始的工作信息
     *
     * @param begin    时间段开始时间
     * @param end      时间段结束时间
     * @param pageNum  分页页数
     * @param pageSize 分页大小
     * @return 工作信息
     */
    PageResponse<PhasedTask> listByBeginDate(Calendar begin, Calendar end, int pageNum, int pageSize);

    /**
     * 获取时间段内开始的所有工作信息
     * @param begin    时间段开始时间
     * @param end      时间段结束时间
     * @return 工作信息
     */
    List<PhasedTask> listByBeginDate(Calendar begin, Calendar end);



    /**
     * 以树形式获取工作列表
     * @return 工作列表s
     */
    List<PhasedTaskWithChildren> listTaskWithChildren(PhaseTaskSearchParam searchParam);

    /**
     * 修改工作进行状态
     * @param id 工作Id
     * @param status 修改后的状态编号
     * @return 修改后的工作
     */
    PhasedTask updateProcessStatus(Long id, int status);

    /**
     * 获取工作所在的任务树
     * @param id 工作Id
     * @return 工作所在的任务树
     */
    PhasedTaskTreeStructure getTree(Long id);

    /**
     * 将固定日期前的进行中工作设置为某进行状态
     * @param processStatus 设置的进行状态
     * @param date 日期
     * @return 修改的工作
     */
    List<PhasedTask> setStatusBeforeData(int processStatus, Calendar date);
}
